﻿using System;
using CPN.PJN.Silverlight.Common.Logging.Configuration;

namespace CPN.PJN.Silverlight.Common.Logging
{
    /// <summary>
    /// Cette classe représente un Logger pour les traces applicatives.
    /// </summary>
    public sealed class Logger
    {
        #region Const

        /// <summary>
        /// Catégorie de log par défaut
        /// </summary>
        public const string DEFAULT_CATEGORY = "General";

        #endregion

        #region Private Members

        /// <summary>
        /// Instance du Logger
        /// </summary>
        private static volatile Logger instance;

        /// <summary>
        /// Objet de synchronisation
        /// </summary>
        private static object syncRoot = new Object();

        #endregion

        #region Instance Property

        /// <summary>
        /// Propriété Instance du Logger
        /// </summary>
        public static Logger Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (syncRoot)
                    {
                        if (instance == null)
                            instance = new Logger();
                    }
                }

                return instance;
            }
        }

        #endregion

        #region Private Constructor

        /// <summary>
        /// Constructeur privé
        /// </summary>
        private Logger() { }

        #endregion

        #region Write Methods

        /// <summary>
        /// Cette méthode écrit le message de log
        /// </summary>
        /// <param name="message">Message de log</param>
        public void Write(object message)
        {
            foreach (var item in LoggerConfigurationManager.Instance.LogCategoryDictionary)
            {
                if (item.Value.IsEnabled)
                {
                    foreach (var listener in item.Value.LogListenerCollection)
                    {
                        listener.Write(message);
                    }
                }
            }

        }
        /// <summary>
        /// Cette méthode écrit le message de log dans une catégorie précise
        /// </summary>
        /// <param name="message">Message de log</param>
        /// <param name="category">Catégorie de log</param>
        public void Write(object message, string category)
        {
            if (LoggerConfigurationManager.Instance.LogCategoryDictionary.ContainsKey(category))
            {
                var cat = LoggerConfigurationManager.Instance.LogCategoryDictionary[category];
                if (cat.IsEnabled)
                {
                    foreach (var listener in cat.LogListenerCollection)
                    {
                        listener.Write(message, category);
                    }
                }
            }

        }

        /// <summary>
        /// Cette méthode écrit le message de log dans une catégorie précise et sa sévérité
        /// </summary>
        /// <param name="message">Message de log</param>
        /// <param name="category">Catégorie de log</param>
        /// <param name="severity">severité</param>
        public void Write(object message, string category, int severity)
        {
            if (LoggerConfigurationManager.Instance.LogCategoryDictionary.ContainsKey(category))
            {
                var cat = LoggerConfigurationManager.Instance.LogCategoryDictionary[category];
                if (cat.IsEnabled && severity <= cat.MinLevel)
                {
                    foreach (var listener in cat.LogListenerCollection)
                    {
                        listener.Write(message, category, severity);
                    }
                }
            }
        }

        /// <summary>
        /// Cette méthode écrit le message de log dans une catégorie précise et sa sévérité
        /// </summary>
        /// <param name="message">Message de log</param>
        /// <param name="category">Catégorie de log</param>
        /// <param name="severity">severité</param>
        /// <param name="data">Données utilisateurs</param>
        public void Write(object message, string category, int severity, params object[] data)
        {
            if (LoggerConfigurationManager.Instance.LogCategoryDictionary.ContainsKey(category))
            {
                var cat = LoggerConfigurationManager.Instance.LogCategoryDictionary[category];
                if (cat.IsEnabled && severity <= cat.MinLevel)
                {
                    foreach (var listener in cat.LogListenerCollection)
                    {
                        listener.Write(message, category, severity, data);
                    }
                }
            }
        }

        #endregion
    }
}
